// 全文搜索引擎
#include <iostream>
#include <stdio.h>
#include <string.h>
#include "codec_utf_8.h"

// ============================================================
// 全文搜索引擎
// 支持功能：文本文件 or 源代码跳转
// 1. 分词索引
// 2. 对搜索内容分词，在找到的文件中再次全文搜索。
// 3. 支持多线程
// 4. 支持代码跳转
// ============================================================
// UTF32 内码 分词
// 建立图
// 图级：词, 文件
// ============================================================

bool analyse_file( const char* filename );
size_t analyse_line( UTF8_CHAR *pBuf, size_t buf_size );

int main()
{
	std::cout << "Search Engine..." << std::endl;
	analyse_file( "/mnt/sdb6/g_dev/macaque/search/source/main.cpp" );
	return 0;
}

bool analyse_file( const char* filename )
{
	if( !filename )
		return false;

	FILE *fp = fopen( filename, "rb" );
	if( fp )
	{
		// 一次读1K的文本
		const int read_len = 1024;
		char date_buf[ read_len ];
		size_t ret_read = 0;			// 返回的读取字节数
		size_t beg_idx = 0;				// 起始位置
		size_t date_len = 0;
		while( true )
		{
			memset( date_buf + beg_idx, 0, read_len - beg_idx );
			ret_read = fread( date_buf + beg_idx, 1, read_len-beg_idx, fp );
			date_len = beg_idx + ret_read;
			if( 0 != ret_read )
			{
				beg_idx = 0;
				while( true )
				{
					size_t line_len = analyse_line( (UTF8_CHAR*)(date_buf + beg_idx), date_len );
					beg_idx += line_len;
					date_len -= line_len;
					// printf( "%u\n", line_len );
					if( line_len == 0 )
					{
						if( date_len > 0 )
						{
							memcpy( date_buf, date_buf+beg_idx, date_len );
							beg_idx = date_len;
						}
						break;
					}
				}
				// 没分析完
			}
			else
			{
				break;
			}
		}
		fclose( fp );
	}
}

// 分析出一行的单词, 返回一行在 pBuf 中的字节数
size_t analyse_line( UTF8_CHAR *pBuf, size_t buf_size )
{
	int idx = 0;
	bool new_line = false;
	size_t utf8_ch_count = 0;
	while( idx < buf_size )
	{
		UTF8_CHAR &ch = pBuf[idx];
		if( ch == '\n' )
		{
			++idx;
			new_line = true;
			break;
		}
		else
		{
			size_t bit_num = 0;
			int ret = utf8_bit_num( &ch, bit_num );
			if( ret )
			{
				idx += bit_num;
			}
			else
			{
				++idx;
			}
			// printf( "----->%d, %u\n", ret, bit_num );
			++utf8_ch_count;
			// printf( "    UTF-8 : %u\n", bit_num );
		}
	}
	printf( "  UTF-8 : % 3u,\tlength : % 3d\n", utf8_ch_count, new_line ? idx : 0 );
	return new_line ? idx : 0;
}

